home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume5 / s5finger / part2 < prev    next >
Encoding:
Text File  |  1989-02-03  |  22.1 KB  |  999 lines

  1. Path: xanth!nic.MR.NET!hal!ncoast!allbery
  2. From: ag@elgar.UUCP (Keith Gabryelski)
  3. Newsgroups: comp.sources.misc
  4. Subject: v05i035: finger distribution for System V machines (2 of 3)
  5. Summary: finger shar 2 of 3
  6. Message-ID: <13@elgar.UUCP>
  7. Date: 9 Nov 88 02:05:02 GMT
  8. Sender: allbery@ncoast.UUCP
  9. Reply-To: ag@elgar.UUCP (Keith Gabryelski)
  10. Organization: Elgar Corporation, San Diego, CA
  11. Lines: 985
  12. Approved: allbery@ncoast.UUCP
  13.  
  14. Posting-number: Volume 5, Issue 35
  15. Submitted-by: "Keith Gabryelski" <ag@elgar.UUCP>
  16. Archive-name: s5finger/Part2
  17.  
  18. #! /bin/sh
  19. # This is a shell archive, meaning:
  20. # 1. Remove everything above the #! /bin/sh line.
  21. # 2. Save the resulting text in a file.
  22. # 3. Execute the file with /bin/sh (not csh) to create the files:
  23. #    finger.h
  24. #    ttyloc.c
  25. #    ttyrots.c
  26. #    ttyloc.h
  27. #    doc
  28. #    novice
  29. # This archive created: Sun Oct 30 14:55:24 1988
  30. export PATH; PATH=/bin:$PATH
  31. if test -f 'finger.h'
  32. then
  33.     echo shar: will not over-write existing file "'finger.h'"
  34. else
  35. cat << \SHAR_EOF > 'finger.h'
  36. /*
  37. ** finger.h  - used in finger, ttyloc, and watson.
  38. **
  39. ** Written by Keith Gabryelski
  40. ** Released into public domain September 1, 1988.
  41. ** Please keep this header.
  42. **
  43. */
  44.  
  45. #include "ttyloc.h"
  46. #include "dbase.h"
  47.  
  48. #define KMEM_FILE    "/dev/kmem"
  49. #define MEM_FILE    "/dev/mem"
  50. #define SWAP_FILE    "/dev/swap"
  51.  
  52. #define DEFAULT_IDLE_TIME (30 * 60)
  53.  
  54. /*
  55. ** whatarewe - A variable with oodles of info about how this finger should
  56. **           look.  Ie, are we a whois?  Should we show a plan?  Should
  57. **           we show mail box info.
  58. */
  59.  
  60. #define LONG        0x00000001    /* Pertinent info about this user. */
  61. #define    PLAN        0x00000002    /* Show a plan if has one. */
  62. #define MAILBOX        0x00000004    /* Show mailbox info if any. */
  63. #define HIDABLE        0x00000008    /* Unames hidden if repeated? */
  64.  
  65. #define SORT_BY_NAME    0x00000000    /* Sort list by name. */
  66. #define SORT_BY_IDLE    0x00000010    /* Sort list by Idle time. */
  67. #define SORT_BY_TTY    0x00000020    /* Sort list by ttyname. */
  68. #define SORT_MASK    0x00000030    /* Sort mask for above. */
  69.  
  70. #define DIALOUT        0x00000040    /* Show DIALOUT lines. (for SCO only)*/
  71.  
  72. #define WHOIS    (LONG|PLAN|MAILBOX)    /* whois. */
  73. #define FINGER    (HIDABLE)        /* default. */
  74.  
  75. extern void get_dbase_info();
  76. extern char *puterr(), *mymalloc(), *myrealloc();
  77.  
  78. /*
  79. ** Some defines for easy access to nlist struct.
  80. */
  81. #define    v_addr        nl[0].n_value
  82. #define    proc_addr    nl[1].n_value
  83.  
  84. /*
  85. ** Below are machine dependent macros and definitions.  On XENIX
  86. ** p_addr[0].te_frameno has the page number of the user structure in
  87. ** /dev/mem.  On the 3B1 it's just p_addr[0].  No sweat.
  88. */
  89.  
  90. #ifdef SCO_XENIX_386
  91. /*
  92. ** Tested on SCO XENIX 2.2.1. on a Zenith 386.
  93. **
  94. */
  95.  
  96. /*
  97. ** Define for all types of SCO systems.
  98. */
  99.  
  100. #define SCO_XENIX
  101.  
  102. #define IN_CORE_USER_STRUCT_ADDRESS  ctob(proc[i].p_addr[0].te_frameno)
  103. #define SWAPPED_USER_STRUCT_ADDRESS  ctob(proc[i].p_addr[0].te_frameno)
  104.  
  105. #endif /* SCO_XENIX_386 */
  106.  
  107. #ifdef SCO_XENIX_286
  108. /*
  109. ** NOT TESTED.  THIS SHOULDN'T WORK!!!
  110. **
  111. */
  112.  
  113. /*
  114. ** Define for all types of SCO systems.
  115. */
  116.  
  117. #define SCO_XENIX
  118.  
  119. /*
  120. ** Couldn't find this in the headers.  Is it somewhere?
  121. ** dbtob == disk blocks to bytes.
  122. */
  123.  
  124. #define dbtob(blocks) ((blocks) * NBPC * NDPC)
  125.  
  126. #define IN_CORE_USER_STRUCT_ADDRESS  ctob(proc[i].p_uaddr)
  127. #define SWAPPED_USER_STRUCT_ADDRESS  dbtob(proc[i].p_addr.p_daddr)
  128.  
  129. #endif /* SCO_XENIX_286 */
  130.  
  131. /*
  132. ** SCO_XENIX defined for all sco machines.  Hardware unrelated.
  133. */
  134.  
  135. #ifdef SCO_XENIX
  136. /*
  137. ** Stuff that is the same for all SCO systems.
  138. */
  139.  
  140. #define KERNEL_FILE    "/xenix"
  141. #endif /* SCO_XENIX */
  142.  
  143. #ifdef UNIX_PC
  144. /*
  145. ** Tested on an AT&T 3b1 (unix pc) SysV.2 machine.
  146. */
  147.  
  148. #define KERNEL_FILE    "/unix"
  149.  
  150. #define IN_CORE_USER_STRUCT_ADDRESS (ctob(proc[i].p_addr[0]) + U_OFFSET)
  151. #define SWAPPED_USER_STRUCT_ADDRESS dbtob(proc[i].p_swaddr)
  152.  
  153. /*
  154. ** If proc is a pointer to an array of struct proc then we must do
  155. ** indirection.  It is on the 3b1.
  156. */
  157. #define DO_INDIRECTION_ON_PROC
  158.  
  159. /*
  160. ** Symbols on the Unix PC do not have prefixed underlines.
  161. */
  162. #define NO_PREFIXED_UNDERLINES_IN_SYMBOLS
  163. #define NEED_NLIST.H
  164. #endif /* UNIX_PC */
  165.  
  166. #ifdef SYSV_3B5
  167. /*
  168. ** Not Tested yet, for I didn't have root privileges on
  169. ** the machine.  I'm not real sure about SWAPPED_USER_STRUCT_ADDRESS.
  170. */
  171.  
  172. #define KERNEL_FILE    "/unix"
  173.  
  174. #define IN_CORE_USER_STRUCT_ADDRESS ctob(proc[i].p_addr)
  175. #define SWAPPED_USER_STRUCT_ADDRESS proc[i].p_swaddr
  176.  
  177. /*
  178. ** Symbols on the 3B5 do not have prefixed underlines.
  179. */
  180. #define NO_PREFIXED_UNDERLINES_IN_SYMBOLS
  181. #define NEED_NLIST.H
  182. #endif /* SYSV_3B5 */
  183.  
  184. /*
  185. ** nlist structure.
  186. */
  187.  
  188. #ifdef NO_PREFIX_UNDERLINES_IN_SYMBOLS
  189. struct nlist nl[] =
  190. {
  191.     { "v", },
  192.     { "proc", },
  193.     { "", },
  194. };
  195. #else /* !NO_PREFIX_UNDERLINES_IN_SYMBOLS */
  196. struct nlist nl[] =
  197. {
  198.     { "_v", },
  199.     { "_proc", },
  200.     { "", },
  201. };
  202. #endif /* NO_PREFIX_UNDERLINES_IN_SYMBOLS */
  203. SHAR_EOF
  204. fi # end of overwriting check
  205. if test -f 'ttyloc.c'
  206. then
  207.     echo shar: will not over-write existing file "'ttyloc.c'"
  208. else
  209. cat << \SHAR_EOF > 'ttyloc.c'
  210. /*
  211. ** ttyloc.c - Setup names for ttys.
  212. **          - For the finger distribution.
  213. **
  214. ** Written by Keith Gabryelski
  215. ** Released into public domain September 1, 1988.
  216. ** Please keep this header.
  217. **
  218. ** Main routine for ttyloc.
  219. */
  220.  
  221. #include <stdio.h>
  222. #include <sys/types.h>
  223. #include <sys/stat.h>
  224. #include <fcntl.h>
  225. #include <pwd.h>
  226. #include "defs.h"
  227. #include "ttyloc.h"
  228.  
  229. extern int errno;
  230. extern char *getlogin(), *ttyname(), *strrchr();
  231. extern struct passwd *getpwnam();
  232.  
  233. extern char *mymalloc(), *myrealloc();
  234.  
  235. char *progname;            /* Our name */
  236.  
  237. main(argc, argv)
  238. int argc;
  239. char **argv;
  240. {
  241.     char *ptr, *ttymess = mymalloc(1);
  242.     char *tty_name = NULL;
  243.     char *ttyfile, *word;
  244.     int options, dflag = FALSE, newdefault = FALSE, specified = FALSE;
  245.  
  246.     ttymess[0] = '\0';
  247.     progname = *argv++; --argc;
  248.  
  249.     options = TRUE;
  250.     while (argc--)
  251.     {
  252.     if (**argv != '-')
  253.         options = FALSE;
  254.     else
  255.         if (options)
  256.         {
  257.         if (!strcmp(*argv, "--"))
  258.             options = FALSE;
  259.         else
  260.         {
  261.             /*
  262.             ** Do the option thing.
  263.             */
  264.             word = *argv+1;
  265.  
  266.             while (*word != '\0')
  267.             switch(*word++)
  268.             {
  269.             case 'd':    /* Use defaults file (~/.ttyloc). */
  270.                 dflag = TRUE;
  271.                 if (*word == '\0')
  272.                 {
  273.                 if (argc > 0)
  274.                     if (**argv != '-')
  275.                     {
  276.                     ttyfile = *argv++; /* Use this file. */
  277.                     --argc;
  278.                     newdefault = TRUE;
  279.                     }
  280.                 }
  281.                 else
  282.                 {
  283.                 ttyfile = word;
  284.                 newdefault = TRUE;
  285.                 }
  286.                 word = "";
  287.                 break;
  288.  
  289.             case 't':        /* For a specific TTY.       */
  290.                 if (*word == '\0')    /* ttyfrob -- with apologize */
  291.                 if (argc--)    /*          to GZT.COLE.   */
  292.                     word = *++argv;
  293.                 else
  294.                 {
  295.                     fprintf(stderr,
  296.                    "%s: `-t' switch specified with no argument.\n",
  297.                         progname);
  298.                     exit(-1);
  299.                 }
  300.  
  301.                 tty_name = word;
  302.                 word = "";
  303.                 break;
  304.  
  305.             default:
  306.                 fprintf(stderr, "%s: invalid switch '%c'.\n",
  307.                     progname, *word);
  308.                 usage();
  309.             }
  310.         }
  311.         *argv++;
  312.         continue;
  313.         }
  314.  
  315.     specified = TRUE;
  316.     ttymess = myrealloc(ttymess, strlen(ttymess) + strlen(*argv) +
  317.                 sizeof(" "));
  318.     strcat(ttymess, *argv++);
  319.  
  320.     if (argc)
  321.         strcat(ttymess, " ");
  322.     }
  323.  
  324. #ifdef DEBUG
  325.     if (specified)
  326.     {
  327.     puts("specified");
  328.     puts(ttymess);
  329.     }
  330. #endif /* DEBUG */
  331.  
  332.     if (tty_name == NULL)
  333.     {
  334.     if ((ptr = ttyname(2)) == NULL)    /* I can just feel the bogusity */
  335.     {
  336.         fprintf(stderr, "%s: not connected to a tty.\n", progname);
  337.         exit(-1);
  338.     }
  339.  
  340.     if ((ptr = strrchr(ptr, '/')) != NULL)
  341.         tty_name = ptr + 1;
  342.     else
  343.     {
  344.         fprintf(stderr, "%s: can't grok your tty.\n", progname);
  345.         exit(-1);
  346.     }
  347.     }
  348.  
  349.     if (dflag)
  350.     if (specified)
  351.     {
  352.         fprintf(stderr, "%s: `-d' switch with literal ttyloc string.\n",
  353.             progname);
  354.         exit(-1);
  355.     }
  356.     else
  357.     {
  358.         char *buffer, *bufferend, *bp, *cp;
  359.         int fd, size;
  360.         struct stat stbuf;
  361.  
  362.         /* Read from default ttyloc file. */
  363.         if (!newdefault)    /* Tack on users home directory? */
  364.         {
  365.         char *name = getlogin();
  366.         struct passwd *pw;
  367.  
  368.         if (name == NULL)
  369.         {
  370.             fprintf(stderr, "%s: can't figure you out.\n", progname);
  371.             exit(-1);
  372.         }
  373.  
  374.         if ((pw = getpwnam(name)) == (struct passwd *)NULL)
  375.         {
  376.             fprintf(stderr, "%s: can't find your home directory.\n",
  377.                 progname);
  378.             exit(-1);
  379.         }
  380.         ttyfile = mymalloc(strlen(pw->pw_dir) + 1 +
  381.                    sizeof(DEFAULT_TTYLOC_FILE));
  382.  
  383.         strcpy(ttyfile, pw->pw_dir);
  384.         strcat(ttyfile, "/");
  385.         strcat(ttyfile, DEFAULT_TTYLOC_FILE);
  386.         }
  387.  
  388.         if ((fd = open(ttyfile, O_RDONLY)) < 0)
  389.         {
  390.         fprintf(stderr, "%s: couldn't open defaults file %s (%s).\n",
  391.             progname, ttyfile, puterr(errno));
  392.         exit(-1);
  393.         }
  394.  
  395.         if (fstat(fd, &stbuf) < 0)
  396.         {
  397.         fprintf(stderr, "%s: couldn't stat defaults file %s (%s).\n",
  398.             progname, ttyfile, puterr(errno));
  399.         exit(-1);
  400.         }
  401.  
  402.         size = stbuf.st_size;
  403.         buffer = mymalloc(size + 1);
  404.         bufferend = buffer + size;
  405.  
  406.         if (read(fd, buffer, size) != size)
  407.         {
  408.         fprintf(stderr, "%s: read failed on %s (%s).\n", progname,
  409.             ttyfile, puterr(errno));
  410.         exit(-1);
  411.         }
  412.  
  413.         bp = buffer;
  414.         while (bp < bufferend)
  415.         {
  416.         for (cp = bp; *bp != ':' && bp < bufferend; ++bp) ;
  417.  
  418.         *bp++ = '\0';
  419.         if (!strcmp(cp, tty_name) || !strcmp(cp, "default"))
  420.         {
  421.             ttymess = bp;
  422.             while (*bp != '\n' && bp < bufferend)
  423.             bp++;
  424.             *bp = '\0';
  425.             break;
  426.         }
  427.         else
  428.         {
  429.             while (*bp != '\n' && bp < bufferend)
  430.             ++bp;
  431.  
  432.             if (*bp == '\n' && bp < bufferend)
  433.             ++bp;
  434.         }
  435.         }
  436.     }
  437.  
  438.     if (specified || dflag)
  439.     {
  440.     if (set_ttyloc(tty_name, ttymess) == -1)
  441.     {
  442.         fprintf(stderr, "%s: couldn't set ttyloc.\n", progname);
  443.         exit(-1);
  444.     }
  445.     }
  446.     else
  447.     if ((ptr = get_ttyloc(tty_name)) == NULL)
  448.     {
  449.         fprintf(stderr, "%s: No ttyloc entry for %s.\n", progname,
  450.             tty_name);
  451.         exit(-1);
  452.     }
  453.     else
  454.         printf("%.*s\n", strnlen(ptr, TTYLOC_LENGTH), ptr);
  455.  
  456.     exit(0);
  457. }
  458.  
  459. usage()
  460. {
  461.     fprintf(stderr, "%s: usage %s [-d [deffile]] [-t ttyname].\n", progname,
  462.         progname);
  463.     exit(-1);
  464. }
  465. SHAR_EOF
  466. fi # end of overwriting check
  467. if test -f 'ttyrots.c'
  468. then
  469.     echo shar: will not over-write existing file "'ttyrots.c'"
  470. else
  471. cat << \SHAR_EOF > 'ttyrots.c'
  472. /*
  473. ** ttyrots.c - For the finger distribution.
  474. **
  475. ** Written by Keith Gabryelski
  476. ** Released into public domain September 1, 1988.
  477. ** Please keep this header.
  478. **
  479. ** Some basic routines used in finger and ttyloc.
  480. */
  481.  
  482. #include <stdio.h>
  483. #include <sys/types.h>
  484. #include <sys/stat.h>
  485. #include <utmp.h>
  486. #include <fcntl.h>
  487. #include "ttyloc.h"
  488. #include "defs.h"
  489.  
  490. extern int errno;
  491. extern struct utmp *getutline();
  492. extern struct ltmp *getltline();
  493.  
  494. extern char *myrealloc();
  495.  
  496. static char *tlocbuf = NULL;
  497.  
  498. static char *
  499. get_default_ttyloc(ttyname)
  500. char *ttyname;
  501. {
  502.     char *ttyloc = "", *tlocbufend, *bp, *cp;
  503.     int fd, size;
  504.     struct stat stbuf;
  505.  
  506.     if ((fd = open(TTYLOCS, O_RDONLY)) < 0 || fstat(fd, &stbuf) < 0)
  507.     return ttyloc;
  508.  
  509.     size = stbuf.st_size;
  510.     tlocbuf = myrealloc(tlocbuf, size + 1);
  511.     tlocbufend = tlocbuf + size;
  512.  
  513.     if (read(fd, tlocbuf, size) != size)
  514.     return ttyloc;
  515.  
  516.     close(fd);
  517.  
  518.     bp = tlocbuf;
  519.     while (bp < tlocbufend)
  520.     {
  521.     for (cp = bp; *bp != ':' && bp < tlocbufend; ++bp) ;
  522.  
  523.     *bp++ = '\0';
  524.     if (!strcmp(cp, ttyname))
  525.     {
  526.         ttyloc = bp;
  527.         while (*bp != '\n' && bp < tlocbufend)
  528.         bp++;
  529.         *bp = '\0';
  530.         break;
  531.     }
  532.     else
  533.     {
  534.         while (*bp != '\n' && bp < tlocbufend)
  535.         ++bp;
  536.  
  537.         if (*bp == '\n' && bp < tlocbufend)
  538.         ++bp;
  539.     }
  540.     }
  541.  
  542.     return ttyloc;
  543. }
  544.  
  545. char *
  546. get_ttyloc(ttyname)
  547. char *ttyname;
  548. {
  549.     char *bp, *cp;
  550.     struct ltmp *lt;
  551.     static struct utmp utbuf, *ut;
  552.  
  553.     strncpy(utbuf.ut_line, ttyname, sizeof(utbuf.ut_line));
  554.  
  555.     if ((ut = getutline(&utbuf)) == (struct utmp *)NULL)
  556.     return NULL;
  557.  
  558.     bp = get_default_ttyloc(ttyname);
  559.  
  560.     if ((lt = getltline(ttyname)) == (struct ltmp *)NULL ||
  561.     lt->lt_time != ut->ut_time)
  562.     {
  563.     cp = bp;
  564.     while (*bp != ':' && *bp != '\0')
  565.         bp++;
  566.  
  567.     *bp = '\0';
  568.     return cp;
  569.     }
  570.  
  571.     return lt->lt_loc;
  572. }
  573.  
  574. set_ttyloc(ttyname, ttyloc)
  575. char *ttyname, *ttyloc;
  576. {
  577.     char *bp, *cp;
  578.     int l, fd;
  579.     static struct ltmp lt;
  580.     static struct utmp utbuf, *ut;
  581.  
  582.     strncpy(utbuf.ut_line, ttyname, sizeof(utbuf.ut_line));
  583.  
  584.     if ((ut = getutline(&utbuf)) == (struct utmp *)NULL)
  585.     return FAIL;
  586.  
  587.     if ((fd = open(LTMP, O_CREAT|O_RDWR, 0622)) < 0)
  588.     return FAIL;
  589.  
  590.     while (read(fd, <, sizeof(struct ltmp)) == sizeof(struct ltmp))
  591.     if (!strcmp(lt.lt_line, ut->ut_line))
  592.     {
  593.         lseek(fd, (long)-sizeof(struct ltmp), 1);
  594.         break;
  595.     }
  596.     
  597.     /* lseek to something divisible by sizeof struct ltmp */
  598.     lseek(fd, lseek(fd, 0, 1) / (long)sizeof(struct ltmp) *
  599.       (long)sizeof(struct ltmp), 0);
  600.  
  601.     strncpy(lt.lt_line, ut->ut_line, sizeof(lt.lt_line));
  602.     lt.lt_time = ut->ut_time;
  603.  
  604. #ifdef DEBUG
  605.     printf("line = %s, time = %lx.\n", lt.lt_line, lt.lt_time);
  606. #endif /* DEBUG */
  607.     bp = get_default_ttyloc(ttyname);
  608.  
  609. #ifdef DEBUG
  610.     printf("bp = `%s'.\n", bp);
  611. #endif /* DEBUG */
  612.  
  613.     cp = bp;
  614.     while (*bp != ':' && *bp != '\0')
  615.     bp++;
  616.  
  617.     if (ttyloc == NULL || *ttyloc == '\0' || *bp == '\0')
  618.     {
  619.     *bp = '\0';
  620.     strncpy(lt.lt_loc, cp, sizeof(lt.lt_loc));
  621. #ifdef DEBUG
  622.     printf("put default %s.\n", cp);
  623. #endif /* DEBUG */
  624.     }
  625.     else
  626.     if (*++bp != '\0')
  627.     {
  628.         strncpy(lt.lt_loc, bp, sizeof(lt.lt_loc));
  629.         l = strnlen(lt.lt_loc, sizeof(lt.lt_loc));
  630.         strncpy(lt.lt_loc+l, ": ", sizeof(lt.lt_loc)-l);
  631.         l = strnlen(lt.lt_loc, sizeof(lt.lt_loc));
  632.         strncpy(lt.lt_loc+l, ttyloc, sizeof(lt.lt_loc)-l);
  633. #ifdef DEBUG
  634.         printf("put :+ %s.\n", lt.lt_loc);
  635. #endif /* DEBUG */
  636.     }
  637.     else
  638.     {
  639.         strncpy(lt.lt_loc, ttyloc, sizeof(lt.lt_loc));
  640. #ifdef DEBUG
  641.         printf("put ttyloc %s.\n", lt.lt_loc);
  642. #endif /* DEBUG */
  643.     }
  644.  
  645.     write(fd, <, sizeof(struct ltmp));
  646.     close(fd);
  647.     return OK;
  648. }
  649.  
  650. struct ltmp *
  651. getltline(line)
  652. char line[12];
  653. {
  654.     int fd;
  655.     static struct ltmp lt;
  656.  
  657.     if ((fd = open(LTMP, O_RDONLY)) < 0)
  658.     return (struct ltmp *)NULL;
  659.  
  660.     while (read(fd, <, sizeof(struct ltmp)) == sizeof(struct ltmp))
  661.     if (!strcmp(lt.lt_line, line))
  662.     {
  663.         close(fd);
  664.         return <
  665.     }
  666.  
  667.     close(fd);
  668.     return (struct ltmp *)NULL;
  669. }
  670. SHAR_EOF
  671. fi # end of overwriting check
  672. if test -f 'ttyloc.h'
  673. then
  674.     echo shar: will not over-write existing file "'ttyloc.h'"
  675. else
  676. cat << \SHAR_EOF > 'ttyloc.h'
  677. /*
  678. ** ttyloc.h - For the finger distribution.
  679. **
  680. ** Written by Keith Gabryelski
  681. ** Released into public domain September 1, 1988.
  682. ** Please keep this header.
  683. */
  684.  
  685. #define TTYLOCS        "/etc/ttylocs"
  686. #define LTMP        "/etc/ltmp"
  687.  
  688. #define    DEFAULT_TTYLOC_FILE    ".ttylocs"
  689. #define    TTYLOC_LENGTH        50
  690.  
  691. struct ltmp
  692. {
  693.     char    lt_line[12];        /* Ttyname. */
  694.     char    lt_loc[TTYLOC_LENGTH];    /* Ttyloc string. */
  695.     time_t    lt_time;        /* Time stamp from utmp. */
  696. };
  697.  
  698. extern char *get_ttyloc();
  699. extern int set_ttyloc();
  700. SHAR_EOF
  701. fi # end of overwriting check
  702. if test ! -d 'doc'
  703. then
  704.     mkdir 'doc'
  705. fi
  706. cd 'doc'
  707. if test -f 'finger.1'
  708. then
  709.     echo shar: will not over-write existing file "'finger.1'"
  710. else
  711. cat << \SHAR_EOF > 'finger.1'
  712. .TH FINGER LOCAL
  713. .SH NAME
  714. finger, whois, \- Who is on the system.
  715. .SH SYNOPSIS
  716. .B finger
  717. [-DIMPSTlmpw] [-i[hh:]mm] [*] [.] [username]
  718. .SH DESCRIPTION
  719. .B finger
  720. will display users that are currently on the system with some useful
  721. information.  The format of finger, with examples, are shown below:
  722.  
  723. .nf
  724. -Name- -Group- --Full Name--        -What- Idle  -TTY- -Loc-
  725. ag     wheel   Keith Gabryelski     emacs        tty02 window2
  726.                                     ksh    1     tty04 window4
  727. root   root    The root of all evil sh     15:26*tty01 window1
  728. tyg    user    Marla Gabryelski     ksh    3:18  tty10 window10
  729.  
  730. .fi
  731. In the above example:
  732.  
  733. .RS
  734. User `ag' is logged on twice.  One on tty02 running emacs with no idle
  735. time and also on tty04 at a korn shell prompt with a 1 minute idle
  736. time.  User `ag' is group wheel and his real name is "Keith
  737. Gabryelski".
  738.  
  739. root is logged in on tty01 at a Bounre shell prompt with an idle time
  740. of 15 hours and 26 minutes.  root's is not receiving messages (denoted
  741. by the asterisk by the tty name).
  742.  
  743. tyg (Marla Gabryelski) is logged in on tty10 at a ksh prompt with an
  744. idle time of 3 hours and 18 minutes.
  745. .RE
  746.  
  747. .B whois
  748. displays users that are currently on the system with some in depth
  749. information about the users.  The format of whois, with examples, are
  750. shown below:
  751.  
  752. .nf
  753. -Name- -Group- --Full Name--        -What- Idle  -TTY- -Console-
  754. ag     wheel   Keith Gabryelski     emacs        tty02 window2
  755.                                     ksh    9     tty04 window4
  756.  
  757. (Keith) </u/ag> Hacking finger and other system commands.
  758. [100, 50] [/bin/ksh] Birthday June 14
  759. Home 10191 Maya Linda Rd. Apt 51; Phone 619 566-2279
  760. Work Elgar Corporation; 9450 Brown Deer Rd.  San Diego;
  761. Phone 619 458-0210
  762. [ag has had no mail since Sat Aug  6 16:17:36 1988]
  763.  
  764.     Tigger's don't climb trees.
  765.  
  766. Plan:
  767. to 'ag'gravate the world...
  768.  
  769. root   root    The root of all evil sh     15:34*tty01 window1
  770. (root-boy) </> Hacking your id into shreads for I am uid 0!
  771. [0, 0] [/bin/sh]
  772. [root has had no mail since Fri Aug  5 10:55:16 1988]
  773.  
  774. tyg    user    Marla Gabryelski     ksh    3:25  tty10 window10
  775. (tyg) </u/tyg> Hacking Mah Jongg for the fun of it.
  776. [99, 51] [/bin/ksh] Birthday January 11
  777. Home 10191 Maya Linda Rd. Apt 51; Phone 566-2279
  778. Work is boring, so I'm never there.; 
  779. [tyg has had no mail since Thu Jul 14 23:00:26 1988]
  780.  
  781.     The wonderful thing about Tiggers
  782.     are Tiggers are wonderful things.
  783.     Their tops are made out of rubber.
  784.     Their bottoms are made of of springs.
  785.     They're bouncey trouncey bouncey trouncey
  786.     FUN!  FUN!  FUN!  FUN!  FUN!
  787.     The wonderful thing about tiggers is ...
  788.         I'm the only one!
  789.     
  790.     A. A. Milne
  791.  
  792. .fi
  793. .RS
  794. The format is obvious.  I shall not explain it.
  795. .RE
  796.  
  797. .SH OPTIONS
  798. Output of finger can be formated by the following options:
  799.  
  800. .TP
  801. -D
  802. This options is only valid on SCO Xenix systems.  Finger (and whois) will
  803. not usually display a port that is used as a DIALOUT.  This options will
  804. display DIALOUT lines if there are any currently are in use.
  805. .TP
  806. -I
  807. Sort by idle time.  From least to longest idle time.  -S is implicitly
  808. specified with this option.
  809. .TP
  810. -M
  811. Force no display of mailbox info.
  812. .TP
  813. -P
  814. Force no display of plan.
  815. .TP
  816. -S
  817. Show repeated user names on output.
  818. .TP
  819. -T
  820. Sort by tty.  -S is implicitly specified with this option.
  821. .TP
  822. -l
  823. Long output.  Like whois without mailbox and plan info.
  824. .TP
  825. -m
  826. Display mailbox info if available.
  827. .TP
  828. -p
  829. Display plan if available.
  830. .TP
  831. -w
  832. Do a whois.  Like doing a finger -lmp
  833. .TP
  834. -i[[hh:]mm]
  835. Don't show users with idle times greater than `hh' hours and `mm'
  836. minutes.  Deault is 30 minutes (:30).
  837. .TP
  838. *
  839. Show all users in the data base.
  840. .TP
  841. \.
  842. Show current user (yourself).
  843. .TP
  844. username
  845. Show username whether logged in or not.
  846. .SH FILES
  847. .nf
  848. ~/.plan                The plan.
  849. /usr/lib/finger/dbase/*        database information for whois.
  850. /usr/lib/finger/nlist        nlist for quick access to the kernel.
  851. .fi
  852. .SH SEE ALSO
  853. bwiz(1), inquire(1), ttyloc(1), watson(1)
  854. .SH AUTHOR
  855. .RS
  856. .PP
  857. Keith M. Gabryelski (ag@elgar.UUCP)
  858. .RE
  859. SHAR_EOF
  860. fi # end of overwriting check
  861. cd ..
  862. if test ! -d 'novice'
  863. then
  864.     mkdir 'novice'
  865. fi
  866. cd 'novice'
  867. if test -f 'nickname'
  868. then
  869.     echo shar: will not over-write existing file "'nickname'"
  870. else
  871. cat << \SHAR_EOF > 'nickname'
  872. This field is should be filled with any nickname you use.
  873. SHAR_EOF
  874. fi # end of overwriting check
  875. if test -f 'workphone'
  876. then
  877.     echo shar: will not over-write existing file "'workphone'"
  878. else
  879. cat << \SHAR_EOF > 'workphone'
  880. Your phone number and/or extension at work.  Examples of the typical
  881. format of work phones are:
  882.  
  883.     (212) 222-1414
  884.     222-1414 x42
  885.     222-1414
  886.     x1414
  887. SHAR_EOF
  888. fi # end of overwriting check
  889. if test -f 'workaddress'
  890. then
  891.     echo shar: will not over-write existing file "'workaddress'"
  892. else
  893. cat << \SHAR_EOF > 'workaddress'
  894. The place where you work.  Usually the name of the company, a street
  895. address, and city.  Like:
  896.  
  897.     Ardvark Emporium; 42 Zoo Place, Anytown
  898. SHAR_EOF
  899. fi # end of overwriting check
  900. if test -f 'homeaddress'
  901. then
  902.     echo shar: will not over-write existing file "'homeaddress'"
  903. else
  904. cat << \SHAR_EOF > 'homeaddress'
  905. Your home address; street address and city.  Like:
  906.  
  907.     69 Homey Lane, Anytown USA
  908. SHAR_EOF
  909. fi # end of overwriting check
  910. if test -f 'homephone'
  911. then
  912.     echo shar: will not over-write existing file "'homephone'"
  913. else
  914. cat << \SHAR_EOF > 'homephone'
  915. Your home phone number.
  916. SHAR_EOF
  917. fi # end of overwriting check
  918. if test -f 'birthday'
  919. then
  920.     echo shar: will not over-write existing file "'birthday'"
  921. else
  922. cat << \SHAR_EOF > 'birthday'
  923. The month and day of your birthday (not the year).  This must be in
  924. the form <month> <day>.  As in:
  925.  
  926.     July 1
  927.     June 14
  928.     February 29
  929. SHAR_EOF
  930. fi # end of overwriting check
  931. if test -f 'supervisor'
  932. then
  933.     echo shar: will not over-write existing file "'supervisor'"
  934. else
  935. cat << \SHAR_EOF > 'supervisor'
  936. Your supervisor's name (or possibly something else).  This field will
  937. be displayed when users use whois along with your project field in the
  938. following format.
  939.  
  940.     Hacking PROJECT for SUPERVISOR
  941.  
  942. SHAR_EOF
  943. fi # end of overwriting check
  944. if test -f 'project'
  945. then
  946.     echo shar: will not over-write existing file "'project'"
  947. else
  948. cat << \SHAR_EOF > 'project'
  949. Your current project.  This field will be displayed when users use
  950. whois along with your supervisor field in the following format.
  951.  
  952.     Hacking PROJECT for SUPERVISOR
  953. SHAR_EOF
  954. fi # end of overwriting check
  955. if test -f 'remark'
  956. then
  957.     echo shar: will not over-write existing file "'remark'"
  958. else
  959. cat << \SHAR_EOF > 'remark'
  960. Some statement that you would like to share with the rest of the users
  961. on the system.
  962.  
  963. SHAR_EOF
  964. fi # end of overwriting check
  965. if test -f 'firstimer'
  966. then
  967.     echo shar: will not over-write existing file "'firstimer'"
  968. else
  969. cat << \SHAR_EOF > 'firstimer'
  970. Watson is an interactive whois data base manager.
  971.  
  972. Watson will ask you questions about yourself and the work you do on
  973. this system.  The information asked (and stored) by watson will be
  974. retrievable by others on the system so they may learn more about you
  975. and your work.
  976.  
  977. Questions asked by watson:
  978.  
  979. Nickname:    A nick name that you use in place of you real name.
  980. Work-Address:    The name and address of the company you work for.
  981. Work-Phone:    Your work phone number
  982. Home-Address:    Your home address.
  983. Home-Phone:    Your home phone number.
  984. Birthday:    The month and day (not year) of your birthday.
  985. Project:    The project you are currently working on.
  986. Supervisor:    Your supervisor or insparation.
  987. Remarks:    Any random remark.
  988.  
  989. You may use a `?' mark for help on commands.  Use "done" to save the
  990. changes you have made to the database or "quit" to exit without saving
  991. current settings.
  992. SHAR_EOF
  993. fi # end of overwriting check
  994. cd ..
  995. #    End of shell archive
  996. exit 0
  997. -- 
  998. ag@elgar.CTS.COM         Keith Gabryelski          ...!{ucsd, jack}!elgar!ag
  999.